• 地位,作用
    • 用于系统管理
    • 但是速度较慢,不适合大数据计算
  • 注意事项
    • 当shell script读取到一个Enter符号(CR)即尝试执行该命令
    • 可以通过反斜杠转义回车来扩展到下一行
    • 用#开头作为批注
  • 执行方式
    • 直接命令执行(绝对路径、相对路径、借助PATH变量)
      • 需要有rx权限
    • 以bash进程来执行(bash shell.sh  或  sh shell.sh)
      • 只需要r权限
      • 会使用一个新的bash进程(子进程)
    • 利用source命令来执行
      • source shell.sh
      • 会在父进程中执行
  • 书写规范
    • 第一行以#!/bin/bash声明该script所用的shell
    • 设置好一些重要的环境变量如PATH何LANG,这样可以直接执行外部命令而无需写绝对路径
    • 文件头注释包括
      • 功能
      • 版本信息
      • 作者与联系方式
      • 版权声明方式
      • history
  • 用exit命令退出程序,并回传一个值(成功运行为0)
  • 数值运算
    • $((............))
    • 如:echo $(( 13 % 3 ))
  • test命令
    • 关于文件名的文件类型判断:test -e filename等
      • -e:(常用)文件是否存在
      • -f:(常用)是否存在且为文件
      • -d:(常用)是否存在且为目录
      • -b、-c、-S、-p、-L:略
    • 关于文件的权限检测:test -r filename等
      • -r:文件是否存在且有r权限
      • -w:文件是否存在且有w权限
      • -x:文件是否存在且有x权限
      • -u:文件是否存在且有SUID属性
      • -g:文件是否存在且有GUID属性
      • -k:文件是否存在且有Sticky bit属性
      • -s:文件是否存在且非空白文件
    • 文件比较:test file1 -nt file2等
      • -nt:(newer than)file1是否比file2新
      • -ot:(older than)file1是否比file2旧
      • -ef:file1和file2是否为同一文件(相同inode)
    • 整数间判定:test n1 -eq n2等
      • -eq:(equal)相等
      • -ne:(not equal)不相等
      • -gt:(greater than)大于
      • -lt:(less than)小于
      • -ge:(greater than or equal)大于等于
      • -le:(less than or equal)小于等于
    • 字符串间的判定:
      • test -z string:是否为空字符串
      • test -n string:是否为非空字符串
        • (-n可以省略,直接test string)
      • test str1 = str2:是否相等
      • test str1 != str2:是否不相等
    • 多重条件判定:test -r filename -a -x filename等
      • -a:(and)
      • -o:(or)
      • !:(not)
  • 判断式
    • 省略了test,直接把参数放到中括号[]中
      • 如:test -z "$HOME"
      •       [ -z "$HOME" ];
    • 注意:
      • 中括号内侧两端必须用空格隔开,和通配符和正则表达式作区分
      • 变量最好用双引号""包含
      • 常量最好用单或双引号包含
      • 否则:
        • name="VBird Tsai"
        • [ $name == "VBird" ] 相当于 [ VBird Tsai == "VBird" ]
  • 默认变量
    • 如执行sh:/path/to/scriptname opt1 opt2 opt3 opt4
      • 那么$0代表了/path/to/scriptname即sh文件的路径
      • $1,$2,$3,$4代表了opt1,opt2,opt3,opt4
    • $#:参数个数
    • $@:所有参数(空格隔开)
    • $*:代表字符串"$1c$2c$3c$4",其中c为分隔符,默认为空格
    •  
    • shift语句:变量号码偏移
      • 不带参数:变量号码左移1,即减1
      • 带参数n:变量号码左移n,即减n
      • 左移会舍弃左边的参数,如shift会舍弃原来的$1
  • 条件判别式
    • 形式
      • if [ 条件判别式 ]; then
      • ............
      • fi
    • 可以有多个条件判别式,之间可以使用逻辑连接符
      • &&
      • ||
    • 多重判断
      • if [ 条件判别式 ]; then
      • .............
      • elif [ 条件判别式 ]; then
      • ............
      • else
      • .............
      • fi
      •  
        • 注意:elif后面有then,但else后面没有
  • 选择判断
    • 形式
      • case $变量 in
      •   "内容1")
      •      ........
      •      ;;
      •   "内容2")
      •      ........
      •      ;;
      •   *)
      •      .......
      •      ;;
      • esac
    • 内容后边有一个右括号
    • 内容对应的动作之后又两个分号
    • *代表了其他情况即default
  • 自定义函数function
    • 形式
      • function fname() {
      •           ............
      • }
    • function内有内置变量
    • $0表示函数名称即fname
    • $1,$2,$3........表示第1,2,3......个变量
  • 循环loop
    • 形式1:当……
      • while [ 条件判别式 ]
      • do
      •       ..........
      • done
    • 形式2:直到……
      • until [ 条件判别式 ]
      • do
      •       ..........
      • done
    • 形式3:类似python
      • for var in con1 con2 con3 ...
      • do
      •       ...........
      • done
      •  
        • 第一次循环$var为con1
        • 第二次循环$var为con2
        • ……
    • 形式4:(类似C语言,但是不能用i++)
      • for ( ( 初始值; 限制值; 步长 ) )
      • do
      •        ......
      • done
  • shell script的追踪和调试:sh
    • 基本语法:sh [-nvx] script.sh
      • -n:仅检查语法
      • -v:执行脚本前先将脚本打印到屏幕上
      • -x:追踪,将使用到的脚本内容打印到屏幕上

\00